iT邦幫忙

2026 iThome 鐵人賽

DAY 7
0
JavaScript

不要再說你不會後端!30 天 Node.js 降維打擊指南 系列 第 7 篇

Day 7:第一階段總結與實作(批次檔案分析 CLI 工具)

  • 分享至 

  • xImage
  •  

恭喜你撐到了第一階段的最後一天!前六天我們分別學會了:

  1. 環境與模組 (Node.js, NPM, ES Modules)
  2. 非同步機制 (Event Loop, async/await)
  3. 核心模組 (fs, path, http, events, stream)

今天是「基礎覺醒」的期末考。我們將不依賴任何第三方套件,純手工打造一個實用的命令列工具 (CLI - Command Line Interface)。這個工具能接收你在終端機輸入的指令,自動掃描指定資料夾,並產出檔案大小與副檔名統計報告。


1. 認識終端機的輸入:process.argv

要讓程式能接收我們在終端機打的字(例如 node app.js myFolder),我們需要讀取 Node.js 的全域變數 process.argv。

實作練習:
在 hello-node 資料夾下,新增一個 cli.js:

// process.argv 會回傳一個陣列:
// [0] 是 node 執行檔的路徑
// [1] 是你執行的檔案路徑 (cli.js)
// [2] 之後才是你在終端機輸入的自訂參數

const args = process.argv;
console.log("收到的所有參數:", args);

// 我們通常只關心第 3 個位置 (索引值 2) 的自訂參數
const targetFolder = process.argv[2] || "沒有輸入參數";
console.log("你指定要分析的資料夾是:", targetFolder);

在終端機執行 node cli.js ./config。你會看到程式成功抓取了 ./config 這個字串。
image


2. 終極實戰:批次檔案分析器

現在清空 cli.js,我們要把前幾天學到的 fs/promises 與 path 完美結合。這個腳本會讀取目標資料夾,判斷它是檔案還是資料夾,並計算總大小與副檔名數量。

import { readdir, stat } from 'fs/promises';
import path from 'path';

// 取得使用者輸入的資料夾路徑,若沒輸入則預設為目前目錄
const targetDir = process.argv[2] || import.meta.dirname;

const analyzeFiles = async (dirPath) => {
    try {
        console.log(`\n 正在分析目錄:${dirPath}\n`);
        
        // 讀取資料夾內容
        const items = await readdir(dirPath);
        
        let totalSize = 0;
        let fileCount = 0;
        let folderCount = 0;
        const extCount = {};

        // 逐一檢查資料夾內的每個項目
        for (const item of items) {
            // 組合出完整的絕對路徑
            const fullPath = path.join(dirPath, item);
            
            // 取得檔案狀態 (大小、類型等)
            const itemStat = await stat(fullPath);
            
            if (itemStat.isDirectory()) {
                folderCount++;
            } else if (itemStat.isFile()) {
                fileCount++;
                totalSize += itemStat.size; // 累加檔案大小 (單位:Bytes)
                
                // 取得副檔名並統計
                const ext = path.extname(item) || '無副檔名';
                extCount[ext] = (extCount[ext] || 0) + 1;
            }
        }

        // 輸出精美的分析報告
        console.log(" 分析報告完成!");
        console.log("---------------------------");
        console.log(` 總資料夾數:${folderCount}`);
        console.log(` 總檔案數:${fileCount}`);
        console.log(` 總檔案大小:${(totalSize / 1024).toFixed(2)} KB`);
        console.log(" 副檔名統計:", extCount);
        console.log("---------------------------\n");

    } catch (error) {
        console.error(" 分析失敗,請確認路徑是否正確或是否有讀取權限。");
        console.error("錯誤訊息:", error.message);
    }
};

// 執行主程式
analyzeFiles(targetDir);

3. 見證你的第一個 Node.js 工具

回到終端機,試著用你的程式去分析不同的資料夾:

  1. 分析目前資料夾(不加參數):
    node cli.js
    image

  2. 分析上一層資料夾:
    node cli.js ../
    image

  3. 分析電腦裡的某個特定路徑(請換成你電腦實際存在的路徑):
    node cli.js C:\Users 或 node cli.js /usr/local
    image

如果終端機順利印出漂亮的統計報表,恭喜你!你已經正式脫離了 Node.js 的新手村。你不再只會在瀏覽器裡操作 DOM,你現在具備了控制作業系統底層檔案的能力。


上一篇
Day 6:事件驅動架構與 EventEmitter 的廣播魔法
下一篇
Day 8:Express.js 快速起步
系列文
不要再說你不會後端!30 天 Node.js 降維打擊指南 共 16 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言